﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using StaticPlugin;
using System.Windows.Forms;
using MosWar;

namespace MosWarAdv
{
    public class jGrabMetro : AJob
    {
        private string status = "idle";

        jGrabMetroSetup setup = new jGrabMetroSetup();
        public override DialogResult showSetupDialog()
        {
            return setup.ShowDialog();
        }
        protected override bool getAvailable()
        {
            return Properties.Settings.Default.cbGrabMetroAvailable;
        }
        protected override string getName()
        {
            return "Выкапывание руды из метро";
        }
        public void AppendStatus(string s)
        {
            List<string> lst = setup.status.Lines.ToList();
            lst.Add(s);

            setup.status.Lines = lst.ToArray();
        }
        protected override string getStatus()
        {
            return status;
        }
        protected override int getPriority()
        {
            if (!Critical)
                return (int)Properties.Settings.Default.numGrabZakoulkiPriority;
            return 1;
        }
        public override void initActions()
        { }
        private bool Critical = false;
        private DateTime dateToAction = DateTime.Now;

        int countKaska
        {
            get
            {
                return Properties.Settings.Default.iGrabMetroCountKaska;
            }
            set
            {
                Properties.Settings.Default.iGrabMetroCountKaska = value;
                Properties.Settings.Default.Save();
            }
        }
        int countKirka
        {
            get
            {
                return Properties.Settings.Default.iGrabMetroCountKirka;
            }
            set
            {
                Properties.Settings.Default.iGrabMetroCountKirka = value;
                Properties.Settings.Default.Save();
            }
        }
        int countGager
        {
            get
            {
                return Properties.Settings.Default.iGrabMetroCountGager;
            }
            set
            {
                Properties.Settings.Default.iGrabMetroCountGager = value;
                Properties.Settings.Default.Save();
            }
        }
        int countKirkaEx
        {
            get
            {
                return Properties.Settings.Default.iGrabMetroCountKirkaEx;
            }
            set
            {
                Properties.Settings.Default.iGrabMetroCountKirkaEx = value;
                Properties.Settings.Default.Save();
            }
        }
        int countKaskaEx
        {
            get
            {
                return Properties.Settings.Default.iGrabMetroCountKaskaEx;
            }
            set
            {
                Properties.Settings.Default.iGrabMetroCountKaskaEx = value;
                Properties.Settings.Default.Save();
            }
        }

        public override bool testRequirements(WebBrowser browser)
        {
            if (Critical) return true;
            if (browser.Url == null) return false;
            if (browser.Url.AbsolutePath == "/player/")
            {
                startCheckSkills(browser);
            }

            bool NeedToGrab = false;

            // определим есть ли уже что копать..
            if (browser.Url.AbsolutePath == "/metro/")
            {
                HtmlElement branch = WebParserEx.getTagByClassName(browser.Document.Body, "div", "metro-branch");
                if (branch != null)
                {
                    HtmlElement vykopali = branch.GetElementsByTagName("div")["vykopali"];
                    if (vykopali != null)
                    {
                        if (vykopali.Style != "DISPLAY: none")
                            NeedToGrab = true;
                    }
                    else
                    {
                        foreach (HtmlElement btn in branch.GetElementsByTagName("button"))
                        {
                            if (btn.InnerText == "Копать здесь")
                            {
                                NeedToGrab = true;
                                break;
                            }
                        }
                    }
                }
                else 
                {
                    branch = browser.Document.Body.GetElementsByTagName("div")["welcome-rat"];
                    if (branch != null) 
                    {
                        foreach (HtmlElement btn in branch.GetElementsByTagName("button"))
                        {
                            if (btn.InnerText == "Напасть на монстра") NeedToGrab = true;
                            break;
                        }
                    }
                }
            }

            if (NeedToGrab)
            {
                Critical = true;
                status = "работа в метро...";
                actions.Clear();
                actions.Add(new Action("работа в метро - AnalyzeMetro", AnalyzeMetro));
                return true;
            }

            if (countKirka == -1 || countKaska == -1 || countGager == -1)
            {
                if (browser.Url.AbsolutePath != "/player/")
                {
                    actions.Clear();
                    actions.Add(new Action("NavigateToPlayer", NavigateToPlayer));
                    return true;
                }
            }
            setup.status.Clear();
            AppendStatus("Кирка: кол-во копок: " + countKirka.ToString());
            AppendStatus("Каска: кол-во спусков в тунель:" + countKaska.ToString());
            AppendStatus("Счетчик Гейгера: кол-во спусков в тунель:" + countGager.ToString());

            // Определим можно ли спуститься в метро на раскопки:

            // ... есть ли инвентарь
            if (countKaska < 1 && countKaskaEx < 1 && !setup.КопатьБезКаски.Checked)
            {
                status = "Нельзя копать без каски";
                return false;
            }
            if (countGager < 1 && !setup.КопатьБезГейгера.Checked)
            {
                status = "Нельзя копать без счетчика Гейгера";
                return false;
            }
            if (countKirka < 1 && countKirkaEx < 1)
            {
                status = "Нельзя копать без кирки";
                return false;
            }

            // ... нет ли других дел
            dateToAction = DateTime.Now;
            HtmlElement elemLinksClear = WebParserEx.getTagByClassName(browser.Document.Body, "div", "header clear");
            if (elemLinksClear == null) return false;
            HtmlElement elemTimeout = elemLinksClear.GetElementsByTagName("a")["timeout"];
            if (elemTimeout != null)
            {
                string strTime = elemTimeout.GetAttribute("timer");
                string strHref = elemTimeout.GetAttribute("href");
                int time = -1;
                string HrefAddr = strHref;
                string MetroAddr = browser.Url.Scheme + "://" + browser.Url.Host + "/metro/";
                bool timeParsed = int.TryParse(strTime, out time);
                if ((timeParsed && HrefAddr == MetroAddr) || (setup.КопатьТолькоЕслиСвободен.Checked && timeParsed && TimeSpan.FromSeconds(time) < TimeSpan.FromMinutes(11.0)))
                {
                    dateToAction = DateTime.Now.Add(TimeSpan.FromSeconds(time));
                }
            }

            if (dateToAction > DateTime.Now)
            {
                status = "Активация ожидается в " + dateToAction.ToShortTimeString();
                return false;
            }
            if (actions.Count > 0) return true;
            status = "...";
            actions.Clear();
            actions.Add(new Action("NavigateToMetro", NavigateToMetro));
            actions.Add(new Action("AnalyzeMetro", AnalyzeMetro));
            return true;
        }


        private void startCheckSkills(WebBrowser b)
        {
            if (b.Url.AbsolutePath != "/player/")
            {
                status = "Не смогли посмотреть скиллы";
                Console.WriteLine(status);
                return;
            }
            HtmlElement elemKirka;
            elemKirka = SkillsDetector.getSkillCaptionByImageAddress(b.Document.Body, "http://www.moswar.ru/@/images/obj/underground2.png");
            if (elemKirka == null)
            {
                status = "Не смогли найти кирку";
                countKirka = 0;
                return;
            }
            string kirka = WebParserEx.getTagByClassName(elemKirka, "span", "brown").OuterText;
            kirka = kirka.Split(' ')[1].Split('/')[0];
            int i = -1;
            int.TryParse(kirka, out i);
            if (i != -1) countKirka = i;
            //////////////
            HtmlElement elemKaska;
            elemKaska = SkillsDetector.getSkillCaptionByImageAddress(b.Document.Body, "http://www.moswar.ru/@/images/obj/underground1.png");
            if (elemKaska == null)
            {
                status = "Не смогли найти каску";
                countKaska = 0;
                return;
            }
            string kaska = WebParserEx.getTagByClassName(elemKaska, "span", "brown").OuterText;
            kaska = kaska.Split(' ')[1].Split('/')[0];
            i = -1;
            int.TryParse(kaska, out i);
            if (i != -1) countKaska = i;
            //////////////////
            HtmlElement elemGager;
            elemGager = SkillsDetector.getSkillCaptionByImageAddress(b.Document.Body, "http://www.moswar.ru/@/images/obj/underground3.png");
            if (elemGager == null)
            {
                status = "Не смогли найти счетчик гейгера";
                countGager = 0;
                return;
            }
            string gager = WebParserEx.getTagByClassName(elemGager, "span", "brown").OuterText;
            gager = gager.Split(' ')[1].Split('/')[0];
            i = -1;
            int.TryParse(gager, out i);
            if (i != -1) countGager = i;
            //////////////////

        }

        public void NavigateToPlayer(WebBrowser b)
        {
            status = "Смотрим на себя";
            if (b.Url.AbsolutePath != "/player/")
            {
                b.Navigate(b.Url.Scheme + "://" + b.Url.Host + "/player/");
            }
        }

        public void NavigateToMetro(WebBrowser b)
        {
            status = "Идем в метро";
            if (b.Url.AbsolutePath != "/metro/")
            {
                b.Navigate(b.Url.Scheme + "://" + b.Url.Host + "/metro/");
            }
        }

        public void AnalyzeMetro(WebBrowser b)
        {
            Critical = false;
            if (b.Url.AbsolutePath != "/metro/")
            {
                status = "Не смогли перейти в метро";
                return;
            }

            // посчитаем сколько кнопок...
            HtmlElement buttonAction = null;
            HtmlElement buttonCancel = null;
            HtmlElement buttonGrab = null;

            HtmlElement branch = b.Document.Body.GetElementsByTagName("div")["welcome-rat"];
            if (branch != null && branch.Style != "DISPLAY: none")
            {
                foreach (HtmlElement btn in branch.GetElementsByTagName("button"))
                {
                    if (btn.InnerText == "Напасть на монстра") buttonAction = btn;
                    if (btn.InnerText == "Мужественно убежать") buttonCancel = btn;
                }
                if (setup.cbНападатьНаКрыс.Checked)
                {
                    status = "Бьем крысу";
                    buttonAction.InvokeMember("click");
                    //actions.Add(new Action("", NavigateToPlayer));
                    return;
                }
                else
                {
                    status = "Убегаем от крысы";
                    buttonCancel.InvokeMember("click");
                    actions.Add(new Action("", NavigateToPlayer));
                    return;
                }
            }

            HtmlElement MetroBranch = WebParserEx.getTagByClassName(b.Document.Body, "div", "metro-branch");
            HtmlElement vykopali = MetroBranch.GetElementsByTagName("div")["vykopali"];
            if (MetroBranch == null)
            {
                status = "Не смогли найти форму раскопок";
                return;
            }

            foreach (HtmlElement btn in MetroBranch.GetElementsByTagName("button"))
            {
                if (btn.InnerText == "Выбраться наружу")
                {
                    buttonCancel = btn;
                    continue;
                }
                if (btn.InnerText == "Копать здесь")
                {
                    buttonAction = btn;
                    continue;
                }
                if (btn.InnerText == "Искать дальше")
                {
                    buttonGrab = btn;
                    continue;
                }
            }
            if (buttonAction != null || (vykopali != null && vykopali.Style != "DISPLAY: none"))
            {
                // Пока копаем всегда не обращая внимание на вероятность нахождения
                status = "Выкапываем руду из метро";
                buttonAction.InvokeMember("click");
                //actions.Clear();
                actions.Add(new Action("", NavigateToPlayer));
                return;
            }

            HtmlElement btnStartGrab = WebParserEx.getTagByClassName(MetroBranch, "div", "button");
            // Анализ наличия кнопок. если есть только button1 => считаем что раскопки еще не начаты
            if (btnStartGrab != null && btnStartGrab.InnerText == "Спуститься в туннель")
            {
                status = "Лезем в подземелья";
                btnStartGrab.InvokeMember("click");
                actions.Add(new Action("", NavigateToPlayer));
                return;
            }
        }
    }
}
